/**
 * [1, N]的数组，再给定L，找两个数x和y，满足
 * 1. x + L == y
 * 2. SIGMA{|i - x|, |i - y|}最小
 * 输出x和y以及最小的SIGMA值。
 * 
 * 简单列举一下，可以发现，如果L比较大，则x处在N/2的位置较好
 * 如果L比较小，则x和y整体处在[1, N]中间比较好。
 * 
 * 考虑到整除，可以令x+=1，再计算一遍，求最小值即可
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using vi = vector<int>;
using llt = long long;

int N, L;

llt sum(int s, int e){
    return (s + e) * (e - s + 1LL) / 2LL;
}

llt f(int x, int y){
    assert(x < y);
    llt ans = 0;

    if(x >= N){
        ans = sum(x - N, x - 1);
    }else if(1 <= x and x < N){
        ans = sum(x - x, x - 1);
        int mid = (x + y) / 2;
        if(mid >= N){
            ans += sum(x - x, N - x);
        }else{
            ans += sum(x - x, mid - x);
            if(y >= N){
                ans += sum(y - N, y - mid - 1);
            }else{
                ans += sum(y - y, y - mid - 1);
                ans += sum(y - y, N - y);
            }
        }
    }else{
        assert(0);
    }

    return ans;
}

void procDa(){
    int x = N / 2;
    int y = x + L;
    llt ans = f(x, y);

    llt tmp = f(x + 1, y + 1);
    if(ans > tmp){
        ans = tmp;
        x += 1;
        y += 1;
    }

    cout << x << " " << y << " " << ans << endl;
    return;
}

void procXiao(){
    int x = (N - L) / 2;
    if(0 == x) x += 1;
    int y = x + L;
    llt ans = f(x, y);

    llt tmp = f(x + 1, y + 1);
    if(ans > tmp){
        ans = tmp;
        x += 1;
        y += 1;
    }

    cout << x << " " << y << " " << ans << endl;
    return;    
}

void work(){
    cin >> N >> L;
    if(1 == N){
        cout << "1 " << 1 + L << " 0\n"; 
        return;
    }
    if(L >= N) return procDa();
    procXiao();
    return;
}



int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) work();
    return 0;
}